package 算法练习;/**
 * @author： li
 * @date： 2022-01-14 18:03
 * @version 1.0
 */
import java.io.IOException;
import java.util.Scanner;
import java.util.Vector;
public class 树形DP {
    static class Node{
        int value;//节点的权值
        Vector<Integer> vector=new Vector();//存储邻接点
        int[] dp=new int[2];//dp[0]表示不选该节点时最大子树的和，dp[1]表示选该节点时的最大子树的和
        boolean visit=false;//记录该节点是否被访问过
    }
    static Node node[];
    public static void dfs(int s) {
        node[s].visit=true;
        int num=node[s].vector.size();
        for(int i=0;i<num;i++) {
            int son=node[s].vector.get(i);
            if(!node[son].visit) {
                dfs(son);//从它的孩子节点继续选下去
                node[s].dp[1]+=Math.max(node[son].dp[0],node[son].dp[1]);//返回孩子节点所在子树的最大分数，加到这颗树上
            }
        }
    }
    public static void main(String[] args) throws IOException{
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        node=new Node[n+1];
        for(int i=1;i<=n;i++) {
            node[i]=new Node();
            node[i].value=sc.nextInt();
            node[i].dp[0]=0;
            node[i].dp[1]=node[i].value;
        }
        for(int i=1;i<n;i++) {
            int u=sc.nextInt();
            int v=sc.nextInt();
            node[u].vector.add(v);
            node[v].vector.add(u);
        }
        dfs(1);
        long score;
        score=Math.max(node[1].dp[0], node[1].dp[1]);
        System.out.println(score);
    }
}
